home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / russell / gc32.lha / pcr_interface.c < prev    next >
C/C++ Source or Header  |  1993-03-04  |  3KB  |  112 lines

  1. /* 
  2.  * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
  3.  * Copyright (c) 1991, 1992 by Xerox Corporation.  All rights reserved.
  4.  *
  5.  * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
  6.  * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
  7.  *
  8.  * Permission is hereby granted to copy this garbage collector for any purpose,
  9.  * provided the above notices are retained on all copies.
  10.  */
  11. # include "gc_private.h"
  12.  
  13. # ifdef PCR
  14. /*
  15.  * Note that POSIX PCR requires an ANSI C compiler.  Hence we are allowed
  16.  * to make the same assumption here.
  17.  * We wrap all of the allocator functions to avoid questions of
  18.  * compatibility between the prototyped and nonprototyped versions of the f
  19.  */
  20. # include "pcr/mm/PCR_MM.h"
  21.  
  22. # define MY_MAGIC 17L
  23.  
  24. void * GC_AllocProc(size_t size, PCR_Bool ptrFree, PCR_Bool clear )
  25. {
  26.     if (ptrFree) {
  27.         void * result = (void *)GC_malloc_atomic(size);
  28.         if (clear && result != 0) bzero(result, size);
  29.         return(result);
  30.     } else {
  31.         return((void *)GC_malloc(size));
  32.     }
  33. }
  34.  
  35. # define GC_ReallocProc GC_realloc
  36.  
  37. # define GC_FreeProc GC_free
  38.  
  39. typedef struct {
  40.   PCR_ERes (*ed_proc)(void *p, size_t size, PCR_Any data);
  41.   bool ed_pointerfree;
  42.   PCR_ERes ed_fail_code;
  43.   PCR_Any ed_client_data;
  44. } enumerate_data;
  45.  
  46. void GC_enumerate_block(h, ed)
  47. register struct hblk *h;
  48. enumerate_data * ed;
  49. {
  50.     register hdr * hhdr;
  51.     register int sz;
  52.     word *p;
  53.     word * lim;
  54.     
  55.     hhdr = HDR(h);
  56.     sz = hhdr -> hb_sz;
  57.     if (sz >= 0 && ed -> ed_pointerfree
  58.         || sz <= 0 && !(ed -> ed_pointerfree)) return;
  59.     if (sz < 0) sz = -sz;
  60.     lim = (word *)(h+1) - sz;
  61.     p = (word *)h;
  62.     do {
  63.         if (PCR_ERes_IsErr(ed -> ed_fail_code)) return;
  64.         ed -> ed_fail_code =
  65.             (*(ed -> ed_proc))(p, WORDS_TO_BYTES(sz), ed -> ed_client_data);
  66.         p+= sz;
  67.     } while (p <= lim);
  68. }
  69.  
  70. struct PCR_MM_ProcsRep * GC_old_allocator = 0;
  71.  
  72. PCR_ERes GC_EnumerateProc(
  73.     PCR_Bool ptrFree,
  74.     PCR_ERes (*proc)(void *p, size_t size, PCR_Any data),
  75.     PCR_Any data
  76. )
  77. {
  78.     enumerate_data ed;
  79.     
  80.     ed.ed_proc = proc;
  81.     ed.ed_pointerfree = ptrFree;
  82.     ed.ed_fail_code = PCR_ERes_okay;
  83.     ed.ed_client_data = data;
  84.     GC_apply_to_all_blocks(GC_enumerate_block, &ed);
  85.     if (ed.ed_fail_code != PCR_ERes_okay) {
  86.         return(ed.ed_fail_code);
  87.     } else {
  88.         /* Also enumerate objects allocated by my predecessors */
  89.         return((*(GC_old_allocator->mmp_enumerate))(ptrFree, proc, data));
  90.     }
  91. }
  92.  
  93. void GC_DummyFreeProc(void *p) {};
  94.  
  95. void GC_DummyShutdownProc(void) {};
  96.  
  97. struct PCR_MM_ProcsRep GC_Rep = {
  98.     MY_MAGIC,
  99.     GC_AllocProc,
  100.     GC_ReallocProc,
  101.     GC_DummyFreeProc,      /* mmp_free */
  102.     GC_FreeProc,          /* mmp_unsafeFree */
  103.     GC_EnumerateProc,
  104.     GC_DummyShutdownProc    /* mmp_shutdown */
  105. };
  106.  
  107. void GC_pcr_install()
  108. {
  109.     PCR_MM_Install(&GC_Rep, &GC_old_allocator);
  110. }
  111. # endif
  112.